package com.ticket.sass.ticketserver.config

import io.swagger.annotations.ApiOperation
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import springfox.documentation.builders.ApiInfoBuilder
import springfox.documentation.builders.ParameterBuilder
import springfox.documentation.builders.PathSelectors
import springfox.documentation.builders.RequestHandlerSelectors
import springfox.documentation.schema.ModelRef
import springfox.documentation.service.ApiInfo
import springfox.documentation.service.Parameter
import springfox.documentation.spi.DocumentationType
import springfox.documentation.spring.web.plugins.Docket
import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc

@Configuration
@EnableSwagger2WebMvc
class SwaggerConfigurer {

    @Bean
    fun createRestApi(): Docket {
        return Docket(DocumentationType.SWAGGER_2)
            .apiInfo(apiInfo())
            .select()
            // 指定要生成 api 接口的包路径
            .apis(RequestHandlerSelectors.basePackage("com.ticket.sass.ticketserver.controller"))
            //使用了 @ApiOperation 注解的方法生成 api 接口文档
            .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation::class.java))
            //可以根据 url 路径设置哪些请求加入文档，忽略哪些请求
            .paths(PathSelectors.any())
            .build()
            .globalOperationParameters(globalRequestParameters())
    }

    private fun apiInfo(): ApiInfo? {
        return ApiInfoBuilder()
            // 标题
            .title("售票系统对接服务")
            // 接口描述
            .description("票务系统对接服务API")
            // 版本信息
            .version("1.0.0")
            .build()
    }

    /**
     * 通用请求参数
     */
    private fun globalRequestParameters(): List<Parameter> {
        return listOf(
            ParameterBuilder().name("Platform").required(true).defaultValue("").description("售票系统类型").parameterType("header").modelRef(ModelRef("string")).build(),
            ParameterBuilder().name("Config").required(true).defaultValue("").description("售票系统服务配置").parameterType("header").modelRef(ModelRef("string")).build(),
        )
    }
}